﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FrbaCommerce;
using System.Data.SqlClient;
using System.Collections.Generic;

namespace FrbaCommerce.Registro_de_Usuario
{
    public partial class frm_registroDeUsuario : Form
    {
        private bool usuarioValido = false;
        private bool contraseniaValida = false;
        private bool tipoNroDocValido = false;
        private bool telefonoCliValido = false;
        private bool cuilValido = false;
        private bool razonSocialValido = false;
        private bool telEmpValido = false;
        private bool cuitValido = false;
        private bool camposObligatorios = false;

        public frm_registroDeUsuario()
        {
            InitializeComponent();
        }

        private void frm_registroDeUsuario_Load(object sender, EventArgs e)
        {
            //---Cargar ComboBox Roles---//
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_ROLES";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_roles = baseDeDatos.consulta(sqlCommand);
            cmb_rolAsignado.DataSource = dt_roles;
            cmb_rolAsignado.DisplayMember = "NOMBRE";
            cmb_rolAsignado.ValueMember = "ID_ROL";
            //---Cargar ComboBox Roles---//

            //---Cargar ComboBox Tipos Documento---//
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_TIPOS_DOCUMENTO";
            DataTable dt_tiposDocumento = baseDeDatos.consulta(sqlCommand);
            cmb_tipoDocCliente.DataSource = dt_tiposDocumento;
            cmb_tipoDocCliente.DisplayMember = "DESCRIPCION";
            cmb_tipoDocCliente.ValueMember = "ID_TIPO_DOC";
            //---Cargar ComboBox Tipos Documento---//
        }

        public static int StrToIntDef(string s, int @default)
        {
            int number;
            if (int.TryParse(s, out number))
                return number;
            return @default;
        }

        //---Habilitar pestañas dependiendo el rol seleccionado---//
        private void cmb_rolAsignado_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id_rol = 1;
            id_rol = StrToIntDef(cmb_rolAsignado.SelectedValue.ToString(),1);
            switch (id_rol)
            {
                case 1:
                {
                    gb_cliente.Enabled = true;
                    gb_empresa.Enabled = false;
                    break;
                }
                case 2:
                {
                    gb_empresa.Enabled = true;
                    gb_cliente.Enabled = false;
                    break;
                }
                default:
                {
                    gb_cliente.Enabled = false;
                    gb_empresa.Enabled = false;
                    break;
                }
            }
        }
        //---Habilitar pestañas dependiendo el rol seleccionado---//
                    
        //---Validar Usuario y Contraseña---//
        private void txt_nombreDeUsuario_Leave(object sender, EventArgs e)
        {
            validar_nombreDeUsuario();
        }

        private void validar_nombreDeUsuario()
        {
            if (txt_nombreDeUsuario.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_USUARIOS_USERNAME";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
                int usuarioExistente = baseDeDatos.ejecuta(sqlCommand);

                if (usuarioExistente > 0)
                {
                    txt_nombreDeUsuario.BackColor = Color.Red;
                    usuarioValido = false;
                }
                else
                {
                    txt_nombreDeUsuario.BackColor = Color.White;
                    usuarioValido = true;
                }
            }
        }

        private void txt_contrasenia_Leave(object sender, EventArgs e)
        {
            validar_contrasenia();
        }

        private void txt_repetirContrasenia_Leave(object sender, EventArgs e)
        {
            validar_contrasenia();
        }

        private void validar_contrasenia()
        {
            if (txt_contrasenia.Text != txt_repetirContrasenia.Text)
            {
                lbl_repetirContraseniaAviso.Text = "La contraseña no coincide";
                contraseniaValida = false;
            }
            if ((txt_contrasenia.Text == "") | (txt_repetirContrasenia.Text == ""))
            {
                lbl_repetirContraseniaAviso.Text = "";
                contraseniaValida = false;
            }
            if (txt_contrasenia.Text == txt_repetirContrasenia.Text)
            {
                lbl_repetirContraseniaAviso.Text = "";
                contraseniaValida = true;
            }
        }
        //---Validar Usuario y Contraseña---//
        
        //---Validar Campos del Cliente---//       
        private void txt_nroDoc_Leave(object sender, EventArgs e)
        {
            validar_nroDocCli();
        }

        private void validar_nroDocCli()
        {
            if (txt_nroDoc.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TIPO_NRO_DOC";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue));
                sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
                int tipoNroDocExistente = baseDeDatos.ejecuta(sqlCommand);

                if (tipoNroDocExistente > 0)
                {
                    txt_nroDoc.BackColor = Color.Red;
                    tipoNroDocValido = false;
                }
                else
                {
                    txt_nroDoc.BackColor = Color.White;
                    tipoNroDocValido = true;
                }
            }
        }

        private void txt_telCliente_Leave(object sender, EventArgs e)
        {
            validar_telCli();
        }

        private void validar_telCli()
        {
            if (txt_telCliente.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TELEFONO";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
                int telefonoCliExistente = baseDeDatos.ejecuta(sqlCommand);

                if (telefonoCliExistente > 0)
                {
                    txt_telCliente.BackColor = Color.Red;
                    telefonoCliValido = false;
                }
                else
                {
                    txt_telCliente.BackColor = Color.White;
                    telefonoCliValido = true;
                }
            }
        }

        private void txt_cuilCliente_Leave(object sender, EventArgs e)
        {
            validar_cuilCli();
        }

        private void validar_cuilCli()
        {
            if (txt_cuilCliente.Text != "")
            {
                if (FuncionesUtiles.validateCuit(txt_cuilCliente.Text) == true)
                {
                    BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                    SqlCommand sqlCommand = new SqlCommand();
                    sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_CUIL";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
                    int cuilCliExistente = baseDeDatos.ejecuta(sqlCommand);

                    if (cuilCliExistente > 0)
                    {
                        txt_cuilCliente.BackColor = Color.Red;
                        cuilValido = false;
                    }
                    else
                    {
                        txt_cuilCliente.BackColor = Color.White;
                        cuilValido = true;
                    }
                }
                else
                {
                    txt_cuilCliente.BackColor = Color.Red;
                    cuilValido = false;
                }
            }
            else
            {
                txt_cuilCliente.BackColor = Color.White;
                cuilValido = true;
            }
        }
        //---Validar Campos del Cliente---//

        //---Validar Campos de la Empresa---//
        private void txt_razonSocialEmpresa_Leave(object sender, EventArgs e)
        {
            validar_razonSocialEmp();
        }

        private void validar_razonSocialEmp()
        {
            if (txt_razonSocialEmpresa.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_RAZON_SOCIAL";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@razon_social", txt_razonSocialEmpresa.Text);
                int razonSocialExistente = baseDeDatos.ejecuta(sqlCommand);

                if (razonSocialExistente > 0)
                {
                    txt_razonSocialEmpresa.BackColor = Color.Red;
                    razonSocialValido = false;
                }
                else
                {
                    txt_razonSocialEmpresa.BackColor = Color.White;
                    razonSocialValido = true;
                }
            }
        }

        private void txt_telEmpresa_Leave(object sender, EventArgs e)
        {
            validar_telEmp();
        }

        private void validar_telEmp()
        {
            if (txt_telEmpresa.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_TELEFONO";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telEmpresa.Text));
                int telEmpExistente = baseDeDatos.ejecuta(sqlCommand);

                if (telEmpExistente > 0)
                {

                }
                else
                {
                    txt_telEmpresa.BackColor = Color.White;
                    telEmpValido = true;
                }
            }
        }

        private void txt_cuitEmpresa_Leave(object sender, EventArgs e)
        {
            validar_cuitEmp();
        }

        private void validar_cuitEmp()
        {
            if (txt_cuitEmpresa.Text != "" && FuncionesUtiles.validateCuit(txt_cuitEmpresa.Text) == true)
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_CUIT";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@cuit", txt_cuitEmpresa.Text);
                int cuitEmpExistente = baseDeDatos.ejecuta(sqlCommand);

                if (cuitEmpExistente > 0)
                {
                    txt_cuitEmpresa.BackColor = Color.Red;
                    cuitValido = false;
                }
                else
                {
                    txt_cuitEmpresa.BackColor = Color.White;
                    cuitValido = true;
                }
            }
            else
            {
                txt_cuitEmpresa.BackColor = Color.Red;
                cuitValido = false;
            }
        }
        //---Validar Campos de la Empresa---//

        //---Validar Campos Obligatorios Completos---//
        private void verificar_campos_obligatorios()
        {
            var camposObligatorios = new List<Control>();
            camposObligatorios.Add(txt_nombreDeUsuario);
            camposObligatorios.Add(txt_contrasenia);
            camposObligatorios.Add(txt_repetirContrasenia);
            camposObligatorios.Add(cmb_rolAsignado);

            if (Convert.ToInt32(cmb_rolAsignado.SelectedValue) == 1)
            {
                camposObligatorios.Add(txt_nombreCliente);
                camposObligatorios.Add(txt_apellidoCliente);
                camposObligatorios.Add(txt_nroDoc);
                camposObligatorios.Add(txt_emailCliente);
                camposObligatorios.Add(txt_telCliente);
                camposObligatorios.Add(txt_dirCliente);
                camposObligatorios.Add(txt_nroDirCliente);
                camposObligatorios.Add(txt_localidadCliente);
                camposObligatorios.Add(txt_CPCliente);
                camposObligatorios.Add(dtp_fecNacCliente);
                camposObligatorios.Add(cmb_tipoDocCliente);
            }
            if (Convert.ToInt32(cmb_rolAsignado.SelectedValue) == 2)
            {
                camposObligatorios.Add(txt_razonSocialEmpresa);
                camposObligatorios.Add(txt_emailEmpresa);
                camposObligatorios.Add(txt_telEmpresa);
                camposObligatorios.Add(txt_dirEmpresa);
                camposObligatorios.Add(txt_nroDirEmpresa);
                camposObligatorios.Add(txt_localidadEmpresa);
                camposObligatorios.Add(txt_CPEmpresa);
                camposObligatorios.Add(txt_cuitEmpresa);
                camposObligatorios.Add(txt_nombreContEmpresa);
                camposObligatorios.Add(dtp_fecCreacEmpresa);
            }

            if (camposObligatorios.All<Control>(campos => campos.Text != ""))
                this.camposObligatorios = true;
            else
                this.camposObligatorios = false;

            var camposIncompletos = camposObligatorios.FindAll(campos => campos.Text == "");
            camposIncompletos.ForEach(campos => campos.BackColor = Color.Red);
            var camposCompletos = camposObligatorios.FindAll(campos => campos.Text != "");
            camposCompletos.ForEach(campos => campos.BackColor = Color.White);
        }
        //---Validar Campos Obligatorios Completos---//

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            this.verificar_campos_obligatorios();
            this.validar_nombreDeUsuario();
            this.validar_contrasenia();

            if (usuarioValido && contraseniaValida && camposObligatorios)
            {
                string rol = cmb_rolAsignado.Text;

                switch (rol)
                {
                    case "Cliente":
                        {
                            this.validar_nroDocCli();
                            this.validar_telCli();
                            this.validar_cuilCli();

                            if (tipoNroDocValido && telefonoCliValido && cuilValido)
                            {
                                this.registrar_usuario_cliente();
                                this.Close();
                            }

                            break;
                        }
                    case "Empresa":
                        {
                            this.validar_razonSocialEmp();
                            this.validar_telEmp();
                            this.validar_cuitEmp();

                            if (razonSocialValido && telEmpValido && cuitValido)
                            {
                                this.registrar_usuario_empresa();
                                this.Close();
                            }

                            break;
                        }
                }
            }
        }

        private void btn_limpiar_Click(object sender, EventArgs e)
        {        
            this.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty);
            this.Controls.OfType<GroupBox>().ToList().ForEach(groupBox => groupBox.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty));
        }

        private void registrar_usuario_cliente()
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_USUARIO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            string contraseniaEncriptada = Encriptar.SHA256(txt_contrasenia.Text);
            sqlCommand.Parameters.AddWithValue("@password", contraseniaEncriptada);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_CLIENTE";
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            sqlCommand.Parameters.AddWithValue("@nombre", txt_nombreCliente.Text);
            sqlCommand.Parameters.AddWithValue("@apellido", txt_apellidoCliente.Text);
            sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue)); //Cambiar
            sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
            sqlCommand.Parameters.AddWithValue("@mail", txt_emailCliente.Text);
            sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
            sqlCommand.Parameters.AddWithValue("@direccion_nombre", txt_dirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@direccion_nro", Convert.ToInt32(txt_nroDirCliente.Text));
            if(txt_pisoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@nro_piso", Convert.ToInt32(txt_pisoDirCliente.Text));
            if (txt_dptoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@depto", txt_dptoDirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@localidad", txt_localidadCliente.Text);
            sqlCommand.Parameters.AddWithValue("@cod_postal", txt_CPCliente.Text);
            if (txt_cuilCliente.Text != "")
            sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
            sqlCommand.Parameters.AddWithValue("@fecha_nac", Convert.ToDateTime(dtp_fecNacCliente.Text));
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void registrar_usuario_empresa()
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_USUARIO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            string contraseniaEncriptada = Encriptar.SHA256(txt_contrasenia.Text);
            sqlCommand.Parameters.AddWithValue("@password", contraseniaEncriptada);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_EMPRESA";
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            sqlCommand.Parameters.AddWithValue("@razon_social", txt_razonSocialEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@mail", txt_emailEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telEmpresa.Text));
            sqlCommand.Parameters.AddWithValue("@direccion_nombre", txt_dirEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@direccion_nro", Convert.ToInt32(txt_nroDirEmpresa.Text));
            if (txt_pisoDirEmpresa.Text != "")
                sqlCommand.Parameters.AddWithValue("@nro_piso", Convert.ToInt32(txt_pisoDirEmpresa.Text));
            if (txt_dptoDirEmpresa.Text != "")
                sqlCommand.Parameters.AddWithValue("@depto", txt_dptoDirEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@localidad", txt_localidadEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@cod_postal", txt_CPEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@cuit", txt_cuitEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@nombre_contacto", txt_nombreContEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@fecha_creacion", Convert.ToDateTime(dtp_fecCreacEmpresa.Text));
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txt_nroDoc_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar)) 
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_telCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_nroDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_pisoDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_CPCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_telEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_nroDirEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_pisoDirEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_CPEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }
    }
}
